package 程序员面试金典;

/**
 * 面试题 05.07. 配对交换
 * 配对交换。编写程序，交换某个整数的奇数位和偶数位，尽量使用较少的指令（也就是说，位0与位1交换，位2与位3交换，以此类推）。
 *
 * 示例1:
 *
 *  输入：num = 2（或者0b10）
 *  输出 1 (或者 0b01)
 * 示例2:
 *
 *  输入：num = 3
 *  输出：3
 * 提示:
 *
 * num的范围在[0, 2^30 - 1]之间，不会发生整数溢出。
 */
public class T05_07 {
    public int exchangeBits(int num) {
        String s = Integer.toBinaryString(num);

        if (s.length() % 2 != 0) {
            s = "0" + s;
        }

        char[] chars = s.toCharArray();

        char temp;
        for (int i = 0; i < chars.length; i = i + 2) {
            temp = chars[i];
            chars[i] = chars[i + 1];
            chars[i + 1] = temp;
        }

        String ans = String.valueOf(chars);
        return Integer.parseInt(ans, 2);

    }

    public int exchangeBits2(int num) {

        int a = 0b01010101010101010101010101010101; //与运算 取偶数位
        int b = 0b10101010101010101010101010101010;

        return ((num & a) << 1) | ((num & b) >> 1);


    }

    public static void main(String[] args) {
        T05_07 t05_07 = new T05_07();
        t05_07.exchangeBits(3);
    }

}
